package com.my.fss.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * 字符串工具类
 * 如果遇到时差问题，请在Java配置中，输入default vm argument ： -Duser.timezone=GMT+08
 * 
 * @author 韩晗
 */
@SuppressWarnings("serial")
public class DateUtil implements java.io.Serializable {
	
	
	public final static long MINUTE_SSS = 60 * 1000;	// 1分钟毫秒数
	public final static long HOUR_SSS = 60 * MINUTE_SSS;	// 1小时毫秒数
	public final static long DAY_SSS = 24 * HOUR_SSS;		// 1天毫秒数
	
	
	/**
	 * 获得当前年月日
	 */
	public static int getYear() {
		return Calendar.getInstance().get(Calendar.YEAR);
	}
	public static int getMonth() {
		return Calendar.getInstance().get(Calendar.MONTH)+1;
	}
	public static int getDay() {
		return Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
	}
	
	/**
	 * 获得传入日期的年月日
	 */
	public static int getYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.YEAR);
	}
	public static int getMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.MONTH)+1;
	}
	public static int getDay(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}
	public static int getDayOfWeek(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	
	/**
	 * 获得当前的日期，格式yyyy-MM-dd
	 */
	public static String getFormatDate() {
		return getFormatDate(null);
	}
	/**
	 * 获得当前的日期时间，格式yyyy-MM-dd HH:mm:ss
	 */
	public static String getFormatDatetime() {
		return getFormatDate("");
	}
	/**
	 * 按fmt将今天的日期格式化
	 */
	public static String getFormatDate(String fmt) {
		return getFormatDate(new Date(), fmt);
	}
	/**
	 * 按时间格式获得字符型当前日期
	 * @param date 		日期
	 * @param fmt 		格式
	 */
	public static String getFormatDate(Date date, String fmt) {
		if (fmt == null) {
			fmt = "yyyy-MM-dd";
		}
		else if ("".equals(fmt)) {
			fmt = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat bartDateFormat = new SimpleDateFormat(fmt);
		return bartDateFormat.format(date).toString();
	}
	
	
	/**
	 * 将日期字符串转成Date
	 * @param dateStr	日期字符串，格式必须是yyyy-MM-dd
	 */
	public static Date toDateStr(String dateStr) {
		return toDateStr(dateStr, null);
	}
	/**
	 * 将日期字符串转成Date
	 * @param dateStr	日期字符串，格式必须是yyyy-MM-dd HH:mm:ss
	 */
	public static Date toDateTimeStr(String dateStr) {
		return toDateStr(dateStr, "");
	}
	/**
	 * 传入字符串，返回日期
	 * @param dateStr 	日期字符串
	 * @param fmt 		日期格式
	 */
	public static Date toDateStr(String dateStr, String fmt) {
		if (null==dateStr || "".equals(dateStr) || "null".equalsIgnoreCase(dateStr)) {
			return null;
		}
		
		if(fmt==null) {
			fmt = "yyyy-MM-dd";
		}
		else if ("".equals(fmt)) {
			fmt = "yyyy-MM-dd HH:mm:ss";
		}
		
		SimpleDateFormat format = new SimpleDateFormat(fmt);

		Date date = null;
		try {
			date = format.parse(dateStr);
		} catch (ParseException e) {}

		return date;
	}

	
	/**
	 * 传入日期字符串和天数，返回增加天数后的日期
	 * @param dateStr	日期字符串
	 * @param days		增加的天数，可以是负数
	 */
	public static Date getDateByAddDays(String dateStr, int days) {
		return new Date(toDateTimeStr(dateStr).getTime() + days*DAY_SSS);
	}
	/**
	 * 传入日期和天数，返回增加天数后的日期
	 * @param date		日期
	 * @param days		增加的天数，可以是负数
	 */
	public static Date getDateByAddDays(Date date, int days) {
		return new Date(date.getTime() + days*DAY_SSS);
	}

	
	/**
	 * 传入日期和月数，返回增加月数后的日期
	 * @param date		日期
	 * @param month		增加的月份，如果为负数则是减少
	 */
	public static Date getDateByAddMonth(Date date, int month) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(date);
		calendar.add(GregorianCalendar.MONTH, month);
		return calendar.getTime();
	}
	/**
	 * 传入日期字符串和月数，返回增加月数后的日期
	 * @param dateStr	年月日的格式必须是"yyyy-MM-dd HH:mm:ss"
	 * @param month		增加的月份，如果为负数则是减少
	 */
	public static Date getNewDateByAddMonth(String dateStr, int month) {
		Date date = toDateTimeStr(dateStr);
		return getDateByAddMonth(date, month);
	}

	
	/**
	 * 传入生日，获得年龄
	 * @param birthday		生日字符串，格式yyyy-MM-dd
	 */
	public static int birthToAge(String birthday) {
		Date date = toDateTimeStr(birthday);
		
		if(date==null) {
			return 0;
		}
		
		return birthToAge(date);
	}
	/**
	 * 传入生日，获得年龄
	 * @param birthday		生日日期
	 */
	public static int birthToAge(Date birthday) {
		if(birthday==null) {
			return 0;
		}
		
		if(birthday.before(new Date())) {
			return getYear()-Integer.parseInt(getFormatDate("yyyy"));
		}
		else {
			return getYear()-Integer.parseInt(getFormatDate("yyyy"))+1;
		}
	}

	
	/**
	 * 传入一个日期，判断是否是今天
	 * @param date 		日期
	 */
	public static boolean isToday(Date date) {
		if(date==null) {
			return false;
		}
		
		return getZeroTime().getTime() == getZeroTime((Date) date).getTime();
	}
	/**
	 * 传入一个日期，判断是否是今天
	 * @param dateStr 		日期字符串，格式yyyy-MM-dd
	 */
	public static boolean isToday(String dateStr) {
		if(dateStr==null || dateStr.trim().equals("")) {
			return false;
		}
		
		return isToday(toDateStr(dateStr));
	}
	
	
	/**
	 * 获得指定日期零点时间
	 * @param date 要计算的日期
	 * @author 王涛
	 * 2015年1月8日
	 */
	public static Date getZeroTime(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		if (date != null) { 
			calendar.setTime(date);
		}
		calendar.set(Calendar.HOUR, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.AM_PM, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}
	/**
	 * 获得当天零点时间
	 * @author 王涛
	 * 2015年1月8日
	 */
	public static Date getZeroTime() {
		return getZeroTime(null);
	}
	
	
	/**
	 * 两个日期差几天
	 * 
	 * @author wx	2017-02-23
	 */
	public static int getDateMulDateToDays(Date endDate, Date startDate) {
		int days = 0;
		long endTime = endDate.getTime()/1000;
		long startTime = startDate.getTime()/1000;
		
		long mul = endTime-startTime;
		
		days = (int) (mul/60/60/24);
		
		return days;
	}


	/**
	 * 计算时长
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static String getDatePoor(Date startDate, Date endDate) {
		// long ns = 1000;
		// 获得两个时间的毫秒时间差异
		long diff = Math.abs(endDate.getTime() - startDate.getTime());
		// 计算差多少天
		long day = diff / DAY_SSS;
		// 计算差多少小时
		long hour = diff % DAY_SSS / HOUR_SSS;
		// 计算差多少分钟
		long min = diff % DAY_SSS % HOUR_SSS / MINUTE_SSS;
		// 计算差多少秒//输出结果
		// long sec = diff % nd % nh % nm / ns;
		return day * 24 + hour + "小时" + min + "分钟";
	}
	
	/**
	 * 计算时长
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static String getDateDuration(Date startDate, Date endDate) {
		// long ns = 1000;
		// 获得两个时间的毫秒时间差异
		long diff = Math.abs(endDate.getTime() - startDate.getTime());
		// 计算差多少天
		long day = diff / DAY_SSS;
		// 计算差多少小时
		long hour = diff % DAY_SSS / HOUR_SSS;
		// 计算差多少分钟
		long min = diff % DAY_SSS % HOUR_SSS / MINUTE_SSS;
		// 计算差多少秒//输出结果
		// long sec = diff % nd % nh % nm / ns;
		return day * 24 + hour + ":" + min + ":00";
	}
}
